package ar.com.ctrln.view.dashboard.administracion.cliente;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import org.springframework.security.access.annotation.Secured;
import org.zkoss.spring.security.SecurityUtil;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Execution;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.Page;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.metainfo.ComponentInfo;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Constraint;
import org.zkoss.zul.Image;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Popup;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Timer;
import org.zkoss.zul.Toolbarbutton;
import org.zkoss.zul.Window;

import ar.com.ctrln.control.administracion.cliente.RegistrarCliente;
import ar.com.ctrln.persistence.model.cliente.Cliente;
import ar.com.ctrln.persistence.model.contacto.Contacto;
import ar.com.ctrln.persistence.model.organizacion.TipoActividad;
import ar.com.ctrln.persistence.model.organizacion.TipoOrganizacion;
import ar.com.ctrln.persistence.model.persona.Direccion;
import ar.com.ctrln.persistence.model.persona.Provincia;
import ar.com.ctrln.persistence.model.persona.Telefono;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;
import ar.com.ctrln.persistence.model.persona.Localidad;
import ar.com.ctrln.persistence.model.sistema.dashboardPpal.Movimiento;
import ar.com.ctrln.services.sistema.principal.GestorMovimiento;

/**
 * Esta clase es controller de la vista .zul, pero podria estar cayendo en
 * repetir la funcionalidad y hacer todo desde las clases del paquete services
 * 
 * @author martin
 * 
 */

@SuppressWarnings("unused")
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class RegistrarClienteController extends AbstractMinimizarVentana {

	private static final long serialVersionUID = 7293861791737040132L;

	@WireVariable
	private RegistrarCliente registrarCliente;

	private Cliente cliente;

	private Localidad localidad;

	private Provincia provincia;

	private Telefono telefono;

	private Telefono fax;

	private Direccion direccion;

	private TipoActividad tipoActividad;

	private TipoOrganizacion tipoOrganizacion;

	@Wire
	private Window wRegistrarCliente;

	@Wire
	private Image imgOk;

	@Wire
	private Textbox txtCuit;

	@Wire
	private Textbox txtRazonSocial;

	@Wire
	private Combobox cboxTipoActividad;

	@Wire
	private Combobox cboxCondicionIVA;

	@Wire
	private Textbox txtTelefono;

	@Wire
	private Textbox txtFax;

	@Wire
	private Textbox txtEmail;

	@Wire
	private Textbox txtWeb;

	@Wire
	private Textbox txtCalle;

	@Wire
	private Intbox txtNumero;

	@Wire
	private Textbox txtDepto;

	@Wire
	private Intbox txtPiso;

	@Wire
	private Textbox txtCpostal;

	@Wire
	private Combobox cboxProvincia;

	@Wire
	private Combobox cboxLocalidad;

	@Wire
	private Toolbarbutton btnRegistrarContacto;

	@Wire
	private Toolbarbutton btnRegistrarCliente;

	@Wire
	private Popup popup;

	private Toolkit toolkit;

	private Dimension scrnsize;

	private Set<Contacto> contactos;

	private Movimiento movimiento;
	private GestorMovimiento gestorMovimiento;

	@Override
	public ComponentInfo doBeforeCompose(Page page, Component parent,
			ComponentInfo compInfo) {
		// TODO Auto-generated method stub
		return super.doBeforeCompose(page, parent, compInfo);
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		// TODO Auto-generated method stub
		super.doAfterCompose(comp);

		/**
		 * seguridad!
		 */
		if (!SecurityUtil.isAllGranted("ROLE_ADMIN")) {
			wRegistrarCliente.onClose();
			Clients.showNotification(
					"No tiene permiso para realizar esta Operacion",
					Clients.NOTIFICATION_TYPE_WARNING, null, "middle_center",
					2500);
		}

		txtCuit.setConstraint(validacionCliente);
		imgOk.setVisible(false);

		cboxProvincia.setModel(new ListModelList<Provincia>(registrarCliente
				.listaProvincias()));

		cboxTipoActividad.setModel(new ListModelList<TipoActividad>(
				registrarCliente.listaTipoActividad()));

		cliente = registrarCliente.getCliente();

		cliente.setContactos(contactos);
		toolkit = Toolkit.getDefaultToolkit();
		scrnsize = toolkit.getScreenSize();
		String strHeight = Integer.toString(scrnsize.height / 2 - 150);
		String strWidth = Integer.toString(scrnsize.width / 2 - 50);
		btnRegistrarCliente.setPopup("popupExito, x=" + strWidth + ", y="
				+ strHeight);

	}

	private Constraint validacionCliente = new Constraint() {

		@Override
		public void validate(Component comp, Object value)
				throws WrongValueException {
			String cuit = value.toString();
			Cliente resultado = registrarCliente.buscarClienteCuit(cuit);
			if (resultado == null) {
				imgOk.setVisible(true);
			} else {
				imgOk.setVisible(false);
				throw new WrongValueException(comp, "Cliente ya Existe!");
			}
		}
	};

	@Listen("onClick = #btnRegistrarCliente")
	public void registrarCliente() {

		Set<Telefono> telefonos = new HashSet<Telefono>();
		Set<Contacto> contactos = new HashSet<Contacto>();
		cliente.setCuit_cuil(txtCuit.getValue());
		cliente.setRazonSocial(txtRazonSocial.getValue());
		cliente.setTipoIva(cboxCondicionIVA.getSelectedItem().getLabel());
		cliente.setSitioWeb(txtWeb.getValue());

		direccion = registrarCliente.getDireccion();

		direccion.setCalle(txtCalle.getValue());

		if (txtNumero.getValue() == null)
			direccion.setNumero("");
		else
			direccion.setNumero(Integer.toString(txtNumero.getValue()));

		direccion.setCodigoPostal(txtCpostal.getValue());

		if (txtDepto.getText() == null) {
			direccion.setDepartamento("");
		} else {
			direccion.setDepartamento(txtDepto.getValue());
		}

		if (txtDepto.getText() == null) {
			direccion.setPiso("");
		} else {
			direccion.setPiso(Integer.toString(txtPiso.getValue()));
		}
		
		direccion.setTipoDireccion(Direccion.TIPO_DIRECCION_FISCAL);

		localidad = (Localidad) cboxLocalidad.getModel().getElementAt(
				cboxLocalidad.getSelectedIndex());
		direccion.setLocalidad(localidad);

		cliente.setDireccion(direccion);

		cliente.setEmail(txtEmail.getText());

		telefono = registrarCliente.getTelefono();
		fax = registrarCliente.getTelefono();

		telefono.setNumero(txtTelefono.getValue());

		telefono.setTipoTelefono(Telefono.TIPO_TELEFONO_ORG);

		fax.setNumero(txtFax.getValue());

		fax.setTipoTelefono(Telefono.TIPO_TELEFONO_FAX);

		telefonos.add(telefono);
		telefonos.add(fax);

		cliente.setTelefonos(telefonos);

		tipoActividad = (TipoActividad) cboxTipoActividad.getModel()
				.getElementAt(cboxTipoActividad.getSelectedIndex());

		cliente.setTipoActividad(tipoActividad);

		tipoOrganizacion = registrarCliente
				.getTipoOrganizacion(TipoOrganizacion.TIPO_CLIENTE);

		cliente.setFechaAlta(new Date());

		cliente.setTipoOrganizacion(tipoOrganizacion);

		registrarCliente.nuevoCliente(cliente);

		popup.close();

		Clients.showNotification("El Cliente " + txtRazonSocial.getValue()
				+ " se registro con exito!", Clients.NOTIFICATION_TYPE_INFO,
				null, "middle_center", 2500);

		wRegistrarCliente.onClose();
		// falta manjear errores!

	}

	@Listen("onSelect = #cboxProvincia")
	public void seleccionLocalidad() {
		provincia = (Provincia) cboxProvincia.getModel().getElementAt(
				cboxProvincia.getSelectedIndex());
		cboxLocalidad.setModel(new ListModelList<Localidad>(registrarCliente
				.listaLocalidadPorProvincia(provincia.getId())));
	}

	@Listen("onClick = #btnRegistrarContacto")
	public void registrarContacto() {
		contactos = new HashSet<Contacto>();
		cliente.setContactos(contactos);
		Executions.createComponents(
				"/zul/administracion/cliente/registrarContacto.zul",
				wRegistrarCliente, null);
	}

}
